package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.TreeMap;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;

/**
 * Okno 1 grafického rozhraní k dotazníku.
 *
 * @author Magda Kutišová
 */
public class Okno1 extends JFrame{
    private JLabel nadpis;
    private JPanel levyPanel;
    private JPanel pravyPanel;
    private JPanel dolniPanel;
    private JTextField jmeno;
    private JTextField prijmeni;
    private JTextField adresa;
    private JTextField telefon;
    private JTextField mobil;
    private JTextField email;
    private JTextField rok;
    private JTable zakladniSkoly;
    private JTable stredniSkoly;
    private JTable vysokeSkoly;
    private JButton zakladniTlac;
    private JButton stredniTlac;
    private JButton vysokeTlac;
    private JButton dalsi;
    private JMenuBar menu;
    private JRadioButton zakladni;
    private JRadioButton stredni;
    private JRadioButton vysoka;
    private ModelTabulky modelZS;
    private ModelTabulky modelSS;
    private ModelTabulky modelVS;
    private ButtonGroup skola;
    private ButtonGroup pohlavi;
    private Map<String,String> data = new TreeMap<String, String>();

    /************************************************************************
     * Konstruktor třídy. Spustí inicializaci okna.
     */
    public Okno1(){
        init();
    }

    /************************************************************************
     * Inicializuje okno.
     */
    private void init(){
        BorderLayout vzhledOkna = new BorderLayout(20, 10);
        setTitle("Dotazník - 1. část");
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setName("okno1");
        setLayout(vzhledOkna);
        nadpis = new JLabel("Pro zařazení do databáze zájemců o práci vyplňte a odešlete následující dotazník.", SwingConstants.CENTER);
        nadpis.setName("nadpis");
        add(nadpis, BorderLayout.NORTH);

        levyPanel = new JPanel();
        levyPanel.setName("levyPanel");
        pravyPanel = new JPanel();
        pravyPanel.setName("pravyPanel");
        dolniPanel = new JPanel();
        dolniPanel.setName("dolniPanel");
        levyPanel.setPreferredSize(new Dimension(300, 200));
        pravyPanel.setPreferredSize(new Dimension(200, 200));

        jmeno = new JTextField();
        prijmeni = new JTextField();
        adresa = new JTextField();
        mobil = new JTextField();
        telefon = new JTextField();
        email = new JTextField();
        rok = new JTextField();

        jmeno.setName("jmeno");
        prijmeni.setName("prijmeni");
        adresa.setName("adresa");
        mobil.setName("mobil");
        telefon.setName("telefon");
        email.setName("email");
        rok.setName("rok");

        levyPanel.setLayout(new GridLayout(0, 2));
        levyPanel.add(new JLabel("Jméno: *"));
        levyPanel.add(jmeno);
        levyPanel.add(new JLabel("Příjmení: *"));
        levyPanel.add(prijmeni);
        levyPanel.add(new JLabel("Adresa: *"));
        levyPanel.add(adresa);
        levyPanel.add(new JLabel("Mobil: *"));
        levyPanel.add(mobil);
        levyPanel.add(new JLabel("Telefon:"));
        levyPanel.add(telefon);
        levyPanel.add(new JLabel("E-mail: *"));
        levyPanel.add(email);
        levyPanel.add(new JLabel("Rok narození: *"));
        levyPanel.add(rok);
        
        pohlavi = new ButtonGroup();
        JRadioButton muz = new JRadioButton("Muž");
        muz.setActionCommand("Muž");
        JRadioButton zena = new JRadioButton("Žena");
        zena.setActionCommand("Žena");
        pohlavi.add(muz);
        pohlavi.add(zena);

        skola = new ButtonGroup();
        zakladni = new JRadioButton("Základní škola");
        zakladni.setActionCommand("Základní škola");
        stredni = new JRadioButton("Střední škola");
        stredni.setActionCommand("Střední škola");
        vysoka = new JRadioButton("Vysoká škola nebo VOŠ");
        vysoka.setActionCommand("Vysoká škola");
        skola.add(zakladni);
        skola.add(stredni);
        skola.add(vysoka);
        zakladni.addActionListener(new Zakladni());
        stredni.addActionListener(new Stredni());
        vysoka.addActionListener(new Vysoka());

        pravyPanel.setLayout(new BoxLayout(pravyPanel, BoxLayout.Y_AXIS));
        pravyPanel.add(new JLabel("Pohlaví: *"));
        pravyPanel.add(muz);
        pravyPanel.add(zena);
        pravyPanel.add(new JLabel("Nejvyšší dokončené vzdělání: *"));
        pravyPanel.add(zakladni);
        pravyPanel.add(stredni);
        pravyPanel.add(vysoka);

        modelZS = new ModelTabulky();
        modelSS = new ModelTabulky();
        modelVS = new ModelTabulky();

        zakladniSkoly = new JTable(modelZS);
        zakladniSkoly.setName("zakladniSkoly");
        stredniSkoly = new JTable(modelSS);
        stredniSkoly.setName("stredniSkoly");
        vysokeSkoly = new JTable(modelVS);
        vysokeSkoly.setName("vysokeSkoly");
        zakladniSkoly.setEnabled(false);
        stredniSkoly.setEnabled(false);
        vysokeSkoly.setEnabled(false);

        dolniPanel.setLayout(new BoxLayout(dolniPanel, BoxLayout.Y_AXIS));
        dolniPanel.add(new JLabel("Základní školy:"));
        dolniPanel.add(zakladniSkoly.getTableHeader());
        dolniPanel.add(zakladniSkoly);
        zakladniTlac = new JButton("Přidat další ZŠ");
        stredniTlac = new JButton("Přidat další SŠ");
        vysokeTlac = new JButton("Přidat další VŠ");
        dolniPanel.add(zakladniTlac).setEnabled(false);
        dolniPanel.add(new JLabel("Střední školy:"));
        dolniPanel.add(stredniSkoly.getTableHeader());
        dolniPanel.add(stredniSkoly);
        dolniPanel.add(stredniTlac).setEnabled(false);
        dolniPanel.add(new JLabel("Vysoké školy:"));
        dolniPanel.add(vysokeSkoly.getTableHeader());
        dolniPanel.add(vysokeSkoly);
        dolniPanel.add(vysokeTlac).setEnabled(false);

        zakladniTlac.addActionListener(new PridatZS());
        stredniTlac.addActionListener(new PridatSS());
        vysokeTlac.addActionListener(new PridatVS());

        dolniPanel.add(Box.createRigidArea(new Dimension(0, 20)));
        dalsi = new JButton("Další");
        dalsi.setEnabled(true);
        dalsi.addActionListener(new Dalsi());
        dolniPanel.add(dalsi);

        levyPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

        add(levyPanel, BorderLayout.WEST);
        add(pravyPanel, BorderLayout.CENTER);
        add(new JScrollPane(dolniPanel), BorderLayout.SOUTH);

        initMenu();

        setJMenuBar(menu);

        pack();
        setLocationRelativeTo(null);
    }

    /*************************************************************************
     * Inicializuje menu.
     */
    private void initMenu(){
        menu = new JMenuBar();
        JMenu soubor = new JMenu("Soubor");
        soubor.setMnemonic('S');
        JMenuItem vynulovat = new JMenuItem("Vynulovat dotazník");
        vynulovat.setMnemonic('V');
        vynulovat.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, ActionEvent.CTRL_MASK));
        vynulovat.addActionListener(new Vynulovat());
        soubor.add(vynulovat);
        JMenuItem konec = new JMenuItem("Konec");
        konec.setMnemonic('K');
        konec.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
        konec.addActionListener(new Konec());
        soubor.add(konec);
        menu.add(soubor);
        JMenu napoveda = new JMenu("Nápověda");
        napoveda.setMnemonic('N');
        JMenuItem informace = new JMenuItem("Informace");
        informace.setMnemonic('I');
        informace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ActionEvent.ALT_MASK));
        informace.addActionListener(new Informace());
        JMenuItem oProgramu = new JMenuItem("O programu");
        oProgramu.setMnemonic('O');
        oProgramu.addActionListener(new OProgramu());
        napoveda.add(informace);
        napoveda.add(oProgramu);
        menu.add(napoveda);
    }

    private class Zakladni implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            if(zakladni.isSelected()){
                zakladniSkoly.setEnabled(true);
                zakladniTlac.setEnabled(true);
                stredniSkoly.setEnabled(false);
                stredniTlac.setEnabled(false);
                vysokeSkoly.setEnabled(false);
                vysokeTlac.setEnabled(false);
            }  
        }

    }

    private class Stredni implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            if(stredni.isSelected()){
                zakladniSkoly.setEnabled(true);
                zakladniTlac.setEnabled(true);
                stredniSkoly.setEnabled(true);
                stredniTlac.setEnabled(true);
                vysokeSkoly.setEnabled(false);
                vysokeTlac.setEnabled(false);
            }
        }

    }

    private class Vysoka implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            if(vysoka.isSelected()){
                zakladniSkoly.setEnabled(true);
                zakladniTlac.setEnabled(true);
                stredniSkoly.setEnabled(true);
                stredniTlac.setEnabled(true);
                vysokeSkoly.setEnabled(true);
                vysokeTlac.setEnabled(true);
            }
        }

    }

    private class PridatZS implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object[] hodnoty = {"","",""};
            modelZS.addRow(hodnoty);
        }

    }

    private class PridatSS implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object[] hodnoty = {"","",""};
            modelSS.addRow(hodnoty);
        }

    }

    private class PridatVS implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object[] hodnoty = {"","",""};
            modelVS.addRow(hodnoty);
        }

    }

    private class Vynulovat implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            jmeno.setText("");
            prijmeni.setText("");
            adresa.setText("");
            telefon.setText("");
            email.setText("");
            mobil.setText("");
            rok.setText("");

            pohlavi.clearSelection();
            skola.clearSelection();

            zakladniSkoly.setEnabled(false);
            zakladniTlac.setEnabled(false);
            stredniSkoly.setEnabled(false);
            stredniTlac.setEnabled(false);
            vysokeSkoly.setEnabled(false);
            vysokeTlac.setEnabled(false);

            modelZS.smazatTabulku();
            modelSS.smazatTabulku();
            modelVS.smazatTabulku();
        }

    }

    private class Konec implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            int ukoncit = JOptionPane.showConfirmDialog(null, "Opravdu chcete ukončit vyplňování dotazníku a"
                    + " ztratit veškerá zadaná data?", "Opravdu ukončit?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if(ukoncit==0){
                System.exit(0);
            }
            else{
                return;
            }
        }

    }

    private class Informace implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String text =
                    "<html><h1>Instrukce k vyplnění dotazníku</h1>"
                    + "<p>Pro zařazení do naší databáze zájemců o práci prosíme<br>"
                    + "vyplňte všechny tři části tohoto dotazníku.</p>"
                    + "<p>V první části vyplňte své osobní údaje a vystudované<br>"
                    + "školy. Pro přidání každé další školy vždy stiskněte příslušné<br>"
                    + "tlačítko. Povinná pole jsou označena hvězdičkou.</p>"
                    + "<p>Ve druhé části vyplňte doplňující informace o vaší osobě.<br>"
                    + "Do sekce jazyky prosím přidejte všechny jazyky, které znáte,<br>"
                    + "v takovém pořadí, jak dobře se jimi domluvíte,<br>"
                    + "čím výše, tím lepší znalost.</p>"
                    + "<p>V poslední části přetažením přesuňte oblasti, ve kterých<br>"
                    + "máte zájem pracovat, z levého seznamu do pravého a opět je<br>"
                    + "seřaďte přetažením myši, čím výše, tím raději byste v oboru<br>"
                    + "pracovali. Nakonec stiskněte tlačítko \"Odeslat\". Kopie vyplněných<br>"
                    + "údajů bude zaslána na vaši e-mailovou adresu. Děkujeme.</html>";            
            JOptionPane.showMessageDialog(null, text, "Informace", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private class OProgramu implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String text =
                    "<html><p>Program vytvořen v rámci bakalářské práce.</p>"
                    + "<p>Magda Kutišová, březen 2011</p></html>";
            JOptionPane.showMessageDialog(null, text, "O programu", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private class Dalsi implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            //zastaví editaci tabulek a uloží rozepsaná data
            if (zakladniSkoly.isEditing()){
                 zakladniSkoly.getCellEditor().stopCellEditing();
            }
            if (stredniSkoly.isEditing()){
                stredniSkoly.getCellEditor().stopCellEditing();
            }
            if (vysokeSkoly.isEditing()){
                vysokeSkoly.getCellEditor().stopCellEditing();
            }
            //zkontroluje, zda jsou vyplněna všechna povinná data
            if (jmeno.getText().equals("") | prijmeni.getText().equals("") | adresa.getText().equals("")
                    | mobil.getText().equals("") | email.getText().equals("") |
                    rok.getText().equals("") | pohlavi.getSelection() == null |
                    skola.getSelection() == null | (zakladniSkoly.isEnabled() &&
                    (modelZS.getRowCount() == 0 || modelZS.getValueAt(0, 0).equals("")
                    || modelZS.getValueAt(0, 1).equals("") || modelZS.getValueAt(0, 2).equals(""))) |
                     (stredniSkoly.isEnabled() &&
                    (modelSS.getRowCount() == 0 || modelSS.getValueAt(0, 0).equals("")
                    || modelSS.getValueAt(0, 1).equals("") || modelSS.getValueAt(0, 2).equals(""))) |
                     (vysokeSkoly.isEnabled() &&
                    (modelVS.getRowCount() == 0 || modelVS.getValueAt(0, 0).equals("")
                    || modelVS.getValueAt(0, 1).equals("") || modelVS.getValueAt(0, 2).equals("")))){
                
                JOptionPane.showMessageDialog(null, "Nejsou vyplněny všechny povinné položky", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            //zkontroluje, zda jsou vyplněna platná data - telefon, mobil, email, roky
            if (!mobil.getText().matches("\\d{9}") || (!telefon.getText().equals("") && !telefon.getText().matches("\\d{9}"))){
                JOptionPane.showMessageDialog(null, "Neplatné telefonní číslo (zadejte bez mezinárodního předčíslí).", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            if (!email.getText().matches(".+@.+\\.[a-z]+")){
                JOptionPane.showMessageDialog(null, "Neplatný e-mail", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            if (!rok.getText().matches("\\d{4}")){
                JOptionPane.showMessageDialog(null, "Neplatný rok narození", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            //uloží data do proměnných
            data.put("01. Jméno", jmeno.getText());
            data.put("02. Příjmení", prijmeni.getText());
            data.put("03. Adresa", adresa.getText());
            data.put("04. Mobil", mobil.getText());
            if (!telefon.getText().equals("")){
                data.put("05. Telefon", telefon.getText());
            }            
            data.put("06. E-mail", email.getText());
            data.put("07. Rok narození", rok.getText());
            data.put("08. Pohlaví", pohlavi.getSelection().getActionCommand());
            data.put("09. Vzdělání", skola.getSelection().getActionCommand());
            if (modelZS.getRowCount() != 0){
                for (int i = 0; i<modelZS.getRowCount(); i++){
                    if(!modelZS.getValueAt(i, 1).toString().matches("\\d{4}|^\\s*$") | !modelZS.getValueAt(i, 2).toString().matches("\\d{4}|^\\s*$")){
                        JOptionPane.showMessageDialog(null, "Neplatná hodnota roku v seznamu škol", "Chyba", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                    data.put("10" +i +". Základní škola "+i, modelZS.getValueAt(i, 0)+" ("+modelZS.getValueAt(i, 1)+" - "+modelZS.getValueAt(i, 2)+")");
                }
            }
            if (modelSS.getRowCount() != 0){
                for (int i = 0; i<modelSS.getRowCount(); i++){
                    if(!modelSS.getValueAt(i, 1).toString().matches("\\d{4}|^\\s*$") | !modelSS.getValueAt(i, 2).toString().matches("\\d{4}|^\\s*$")){
                        JOptionPane.showMessageDialog(null, "Neplatná hodnota roku v seznamu škol", "Chyba", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                    data.put("20" +i +". Střední škola "+i, modelSS.getValueAt(i, 0)+" ("+modelSS.getValueAt(i, 1)+" - "+modelSS.getValueAt(i, 2)+")");
                }
            }            
            if (modelVS.getRowCount() != 0){
                for (int i = 0; i<modelVS.getRowCount(); i++){
                    if(!modelVS.getValueAt(i, 1).toString().matches("\\d{4}|^\\s*$") | !modelVS.getValueAt(i, 2).toString().matches("\\d{4}|^\\s*$")){
                        JOptionPane.showMessageDialog(null, "Neplatná hodnota roku v seznamu škol", "Chyba", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                    data.put("30" +i +". Vysoká škola "+i, modelVS.getValueAt(i, 0)+" ("+modelVS.getValueAt(i, 1)+" - "+modelVS.getValueAt(i, 2)+")");
                }
            }
            //přejde do dalšího okna            
            Okno2 okno2 = new Okno2(data);
            dispose();
            okno2.setVisible(true);
        }

    }

}
